package geradores;

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import util.ArquivoUtil;
import analisadorSemantico.Simbolo;

public class GeradorCodigoObjetoTabela {

	private static String nomeArquivoSaida = "Tabela";

	private static String caminhoArquivo = "c:\\gerador\\saida\\";

	private PrintWriter arquivoSaidaTabela;

	private List<Simbolo> terminaisLiterais = new ArrayList<>();

	/**
	 * Construtor Padrão
	 * 
	 * @param terminaisLiterais
	 */
	public GeradorCodigoObjetoTabela(List<Simbolo> terminaisLiterais) {
		super();
		this.terminaisLiterais = terminaisLiterais;

		try {
			arquivoSaidaTabela = ArquivoUtil.criarArquivo(caminhoArquivo, nomeArquivoSaida + ".java");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Método para gerar o a Classe tabela
	 */
	public void gerar() {

		// INICIO IMPORTS

		ArquivoUtil.escreverArquivo("// INICIO IMPORTS\n\n\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("import java.util.ArrayList;\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("import java.util.List;\n\n\n\n", arquivoSaidaTabela);

		// INICIO METODO VERIFICAR SE É PALAVRA RESERVADA

		ArquivoUtil.escreverArquivo("public class " + nomeArquivoSaida + "{\n\n", arquivoSaidaTabela);

		ArquivoUtil.escreverArquivo("// INICIO METODO VERIFICAR SE É PALAVRA RESERVADA \n\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo(
				"private static List<String> listaPalavraReservada = gerarPalavrasReservadas();\n\n",
				arquivoSaidaTabela);

		ArquivoUtil.escreverArquivo("public static boolean ehPalavraReservada(String lido) {\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tif (listaPalavraReservada.contains(lido)) {\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\t\treturn true;\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\t\treturn false;\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\t}\n\n", arquivoSaidaTabela);

		// INICIO METODO POPULA LISTA DE PALAVRAS RESERVADAS

		ArquivoUtil.escreverArquivo("//INICIO METODO POPULA LISTA DE PALAVRAS RESERVADAS\n\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("private static List<String> gerarPalavrasReservadas() {\n\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tList<String> palavraReservadas = new ArrayList<String>();\n\n",
				arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"private\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"public\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"protected\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"for\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"if\");\n", arquivoSaidaTabela);

		for (Simbolo simbolo : this.terminaisLiterais) {
			if (!simbolo.getImagem().trim().equalsIgnoreCase("")) {
				ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"" + simbolo.getImagem().trim() + "\");\n",
						arquivoSaidaTabela);
			}
		}
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"int\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"Integer\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"String\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"Long\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"long\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"static\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"try\");\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\tpalavraReservadas.add(\"this\");\n\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\treturn palavraReservadas;\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("\t}\n", arquivoSaidaTabela);
		ArquivoUtil.escreverArquivo("}\n", arquivoSaidaTabela);

		fechaArquivo();
	}

	/**
	 * Método para fechar o arquivo
	 */
	private void fechaArquivo() {
		ArquivoUtil.fecharArquivo(arquivoSaidaTabela);
	}

}
